// 这个文件会帮我们打包 packages下的文件 最终打包出js文件
// node dev.js (要打包的名字 -f 打包的格式)  ===argv
import minimist from "minimist";
import { resolve, dirname } from "path";
import { fileURLToPath } from "url";
import { createRequire } from "module";
import esbuild from "esbuild";
// node中的命令参数通过process 来获取process.argv
// 模块中不能使用import es6语法 要在 package.json中 加上 type:'module'
// minist 解析命令行传过来的参数 node script/dev.js reactivity -f esm
const args = minimist(process.argv.slice(2)); // { _: [ 'reactivity' ], f: 'esm' }
//node中esm模块取不到__dirname 要自己解析
const __filename = fileURLToPath(import.meta.url); //import.meta.url 是带file:开头的 用fileURLToPath解析 file:->/use 文件的绝对路径
const __dirname = dirname(__filename); // 转化为当前文件夹的绝对路径
// ES modules模块中无法用require 用方法自己创造一个
const require = createRequire(import.meta.url);
const target = args._[0] || "reactivity";
const format = args.f || "iife"; //打包后的模块规范
//node中esm模块没有__dirname 要自己解析
// 入口文件
const entry = resolve(__dirname, `../packages/${target}/src/index.ts`);
const pkg = require(`../packages/${target}/package.json`);
console.log(entry);

//根据需要打包
esbuild
  .context({
    entryPoints: [entry], //入口文件
    outfile: resolve(__dirname, `../packages/${target}/dist/${target}.js`),
    bundle: true, // reactivity->shared 会打包到一起
    platform: "browser", //打包会给浏览器使用
    sourcemap: true, //可以调试代码
    format, // cjs esm iife
    globalName: pkg.buildOption?.name, // iife 格式下需要包的名字  打包后是立即执行函数 给立即执行函数命名
  })
  .then((ctx) => {
    console.log("start dev");
    return ctx.watch(); //监控入口文件 持续进行打包
  });
